#include "abstractmodule.h"
#include <QDebug>

#include "pkeylist.h"

AbstractModule::map_ModuleObj_DatPointer  AbstractModule::m_map_module_dat = AbstractModule::init_map_module_dat();

AbstractModule::AbstractModule():
    m_index_of_moduleList(-1)
{
    m_p_key = new PKey();
}

AbstractModule::~AbstractModule()
{
    delete m_p_key;
}

void AbstractModule::setInstalledDat ( bool b )
{
    AbstractDat::setInstalledDat(b);
    if (b)
    {
        m_map_module_dat[this->getModuleDat()] = this;
    }
    else
    {
        m_map_module_dat.erase(this->getModuleDat());
    }
}

ExaModuleObj AbstractModule::getModuleDat ( void ) const
{
    return EXA_MODULE_OBJ_UNKNOWN;
}

AbstractModule::map_ModuleObj_DatPointer AbstractModule::init_map_module_dat()
{
    map_ModuleObj_DatPointer map;
    map[EXA_MODULE_OBJ_UNKNOWN]=0;
    return map;
}

AbstractModule* AbstractModule::getModule( ExaModuleObj m)
{
    if (m_map_module_dat.count(m) == 1)
    {
        return m_map_module_dat[m];
    }
    else
    {
        return 0;
    }
}

void AbstractModule::resetModule ( void )
{
    *m_p_key = PKey();
}

void AbstractModule::setIndexOfModuleList ( int index )
{
    m_index_of_moduleList = index;
}

int AbstractModule::getIndexOfModuleList ( void ) const
{
    return m_index_of_moduleList;
}

PKey* AbstractModule::getModulePointerKey ( void ) const
{
    return m_p_key;
}

void AbstractModule::save ( void )
{
    m_p_key_cache = *m_p_key;
}

void AbstractModule::restore ( void )
{
    *m_p_key = m_p_key_cache;
}

void AbstractModule::setModuleKey ( const PKey &key )
{
    *m_p_key = key;
}

void AbstractModule::setModuleKey ( const string &key )
{
    m_p_key->setKeyStr(key);
}

void AbstractModule::setModuleDescr ( const string &descr )
{
    m_p_key->setDescr(descr);
}

string AbstractModule::getModuleKey ( void ) const
{
    return m_p_key->getKeyStr();
}

string AbstractModule::getModuleDescr ( void ) const
{
    return m_p_key->getDescr();
}

string AbstractModule::buildDlgTitle ( void ) const
{
    // Ottengo il puntatore della lista dei file
    PKeyList* p = PKeyList::getListPointer(EXA_TAB_FILELIST);

    int index_of_module = getIndexOfModuleList();

    string key;
    if (index_of_module != -1)
    {
        key = p->getAt(index_of_module).getKeyStr();
    }
    else
    {
        key = "...";
        qDebug()<<"errore in AbstractModule::getDlgTitle";
    }
    string title = "ID:"+key;
    return title;
}

void AbstractModule::renameLinkedFileList ( void ) const
{
    PKeyList* p = PKeyList::getListPointer(EXA_TAB_FILELIST);

    int index_of_module = getIndexOfModuleList();

    p->rename(index_of_module,
              getModuleKey(),
              getModuleDescr()
              );
}

int AbstractModule::dlgExec ( void )
{
    if (DlgBasedQt::dlgExec())
    {
        renameLinkedFileList();
        return 1;
    }
    return 0;
}
